import qs from "qs";
import axios from "axios";
import store from "@/store";
import { isDev, baseUrl } from "@/config/env";
const appVersion = require("@/../package.json").version;
import { href } from "cl-admin/utils";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { Message, MessageBox } from "element-ui";
axios.defaults.timeout = 30000;
// axios.defaults.withCredentials = true;
const service = axios.create({
	// baseURL: url,
	timeout: 30 * 1000
});
NProgress.configure({
	showSpinner: false
});

// 忽略规则
const ignore = {
	NProgress: ["/sys/info/record", "/group/customer/lists"],
	token: ["/login", "/ddlogin", "/captcha", "/bizinfo"]
};

let versionPrompt = null

// 请求队列
let requests = [];

// Token 是否刷新中
let isRefreshing = false;

// Request
service.interceptors.request.use(
	config => {
		const token = store?.getters?.token || "";
		const { url, data = {}, params = {}, method } = config;
		config.headers["version"] = appVersion
		if (url) {
			if (!ignore.token.some(e => url.includes(e))) {
				config.headers["token"] = token;
			}

			if (!ignore.NProgress.some(e => url.includes(e))) {
				NProgress.start();
			}
		}

		// 请求信息
		if (isDev) {
			// console.group(url);
			// console.table({
			// 	url: "/group" + url.replace(baseUrl, ""),
			// 	method: method.toLocaleUpperCase(),
			// 	query: qs.stringify(params),
			// 	data: JSON.stringify(qs.parse(data))
			// });
			// console.log("query:", params);
			// console.log("data:", data || {});
			// console.groupEnd();
		}

		// 设置 axios 为form-data
		// config.headers.post["Content-Type"] = 'application/x-www-form-urlencoded';

		// 验证 token
		// if (token) {
		// 	if (config.url.includes("refreshToken")) {
		// 		return config;
		// 	}

		// 	// 判断 token 是否过期
		// 	if (storage.isExpired("token")) {
		// 		// 判断 refreshToken 是否过期
		// 		if (storage.isExpired("refreshToken")) {
		// 			store.dispatch("userRemove");
		// 			return href("/login");
		// 		}

		// 		// 是否在刷新中
		// 		if (!isRefreshing) {
		// 			isRefreshing = true;

		// 			store.dispatch("refreshToken").then(token => {
		// 				requests.forEach(cb => cb(token));
		// 				requests = [];
		// 				isRefreshing = false;
		// 			});
		// 		}

		// 		return new Promise(resolve => {
		// 			// 继续请求
		// 			requests.push(token => {
		// 				// 重新设置 token
		// 				config.headers["Authorization"] = token;
		// 				resolve(config);
		// 			});
		// 		});
		// 	}
		// }

		return config;
	},
	error => {
		return Promise.reject(error);
	}
);

// Response
service.interceptors.response.use(
	res => {
		NProgress.done();
		const { code, data, msg } = res.data;
		if (!res.data) {
			return res;
		}
		if (code === 1) {
			return data;
		}
		return Promise.reject(msg);
	},
	async error => {
		NProgress.done();
		Message.closeAll();
		if (error.response) {
			const { status, config, data } = error.response;
			switch (status) {
				case 400:
					// await store.dispatch("userRemove");
					// href("/login");
					// return Promise.reject(error.response.data.msg);
					data?.msg && typeof data.msg == "string" && Message.error(data.msg);
					break;
				case 401:
					// await store.dispatch("userRemove");
					// href("/login");
					Message.error(data.msg);
					if (!isDev) {
						sessionStorage.setItem("isLoginReload", true);
					}
					store.dispatch("userLogout").done(() => {
						const dingLoginHref = sessionStorage.getItem('dingAutoLogin')
						if (dingLoginHref) {
							href(dingLoginHref);
							return false
						}
						href("/login");
					});
					break;

				case 403:
					console.error(`${config.url} 无权限访问！！`);
					if (data.msg == '版本过低' && !versionPrompt) {
						versionPrompt = true
						MessageBox.confirm('当前有最新版本，请按F5或者点击确定按钮刷新页面！','提示', {
							confirmButtonText: '确定',
							cancelButtonText: '取消',
							type: 'warning'
						}).then(() => {
							location.reload();
						}).catch(() => {
							versionPrompt = false
						})
					} else {
						if (data.msg && data.msg != '版本过低') {
							href("/403");
						}
					}
					break;

				case 404:
					break;

				case 500:
					Message.error("系统异常，请联系管理员 :)");
					if (!isDev) {
						// href("/500");
						return Promise.reject("服务器内部错误");
					}
					break;
				case 502:
					Message.error("服务超时，请重试 :)");
					if (isDev) {
						return Promise.reject("服务超时，请重试 :)");
					} else {
						// href("/502");
					}
					break;
				case 503:
					Message.error("服务暂时不可用 :)");
					break;
				case 504:
					Message.error("系统繁忙，请稍后再试 :)");
					break;
				default:
					console.error(status, config.url);
			}
			return Promise.reject(data.msg);
		}

		Message.error("网络异常，请检查网络是否连接正常:)");
		return Promise.reject("网络异常，请检查网络是否连接正常 :)");
	}
);

export default service;